ShowTable of Contents
はじめに
XPages の裏側のでは JavaServer Faces の技術が使われています。より良い XPages アプリケーションを作成するには、この JSF の仕組みの理解が必要です。この記事では XPages の裏側で動く JSF のライフサイクルの動きを知るための方法を紹介します。
faces-config.xml の設定
JSF ライフサイクルのフェーズを表示するには、フェーズリスナーとなる Java クラスを実装し、JSF コンテナに登録する必要があります。XPages の場合も、普段は見えないですが NSF ファイルの中に JSF の設定が隠れています。
Domino Designer のメニューから 「ウィンドウ」→「Eclipse ビューの表示」→「パッケージエクスプローラ」を選択して。パッケージエクスプローラーを表示します。これは NSF 内部の設計要素を Eclipse File System を通してひょうじします。
WebContent\WEB-IN フォルダの下の \faces-config.xsml を開き、以下のような <lifecycle> 定義を追加します。
<?xml version="1.0" encoding="UTF-8"?>
<faces-config>
<lifecycle>
<phase-listener>mypackage.MyPhaseListener</phase-listener>
</lifecycle>
</faces-config>
Java クラスの実装
先ほど定義した faces-config.xml にし従い、JSF ライフサイクルを表示するフェーズリスナーを実装します。
Domino Designer で「アプリケーション」タブに戻り「コード/Java」で新規の Java クラスを以下のように定義します。これは先ほどの faces-config.xml に合わせて設定します。
パッケージ: mypackage
クラス: MyPhaseListener
package mypackage;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
public class MyPhaseListener implements PhaseListener {
private static final long serialVersionUID = 1L;
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
public void beforePhase(PhaseEvent phaseEvent) {
System.out.println("=== フェーズ開始 " + phaseEvent.getPhaseId().toString());
}
public void afterPhase(PhaseEvent phaseEvent) {
System.out.println("=== フェーズ終了 " + phaseEvent.getPhaseId().toString());
if (phaseEvent.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) {
System.out.println("=== XPage 処理完了");
System.out.println(".");System.out.println(".");
}
}
}
テスト
これで準備は完了です。
同じ NSF ファイルに適当な XPage を作成します。この XPage には部分更新を行うボタンも配置してください。そして、この XPage をブラウザで表示したり、ボタンを押して部分更新をすることで、JSF ライフサイクルの様子が Domino コンソールに表示されます。
※ Domino Designer でのプレビューのときにはコンソールがないので、出力の内容は log.nsf に表示されます。Domino Designer の notes.ini に DEBUG_CONSOLE=1 を設定して再起動することで Domino のようにコンソールを出力することもできます。
XPage を表示したときのコンソール
[00FC:000B-0EB0] 2013/03/18 23:58:23 HTTP JVM: === フェーズ開始 RENDER_RESPONSE 6
[00FC:000B-0EB0] 2013/03/18 23:58:23 HTTP JVM: === フェーズ終了 RENDER_RESPONSE 6
[00FC:000B-0EB0] 2013/03/18 23:58:23 HTTP JVM: === XPage 処理完了
[00FC:000B-0EB0] 2013/03/18 23:58:23 HTTP JVM:
[00FC:000B-0EB0] 2013/03/18 23:58:23 HTTP JVM:
部分更新をしたときのコンソール
[00FC:000B-0EB0] 2013/03/18 23:58:33 HTTP JVM: === フェーズ開始 RESTORE_VIEW 1
[00FC:000B-0EB0] 2013/03/18 23:58:33 HTTP JVM: === フェーズ終了 RESTORE_VIEW 1
[00FC:000B-0EB0] 2013/03/18 23:58:33 HTTP JVM: === フェーズ開始 APPLY_REQUEST_VALUES 2
[00FC:000B-0EB0] 2013/03/18 23:58:33 HTTP JVM: === フェーズ終了 APPLY_REQUEST_VALUES 2
[00FC:000B-0EB0] 2013/03/18 23:58:33 HTTP JVM: === フェーズ開始 PROCESS_VALIDATIONS 3
[00FC:000B-0EB0] 2013/03/18 23:58:33 HTTP JVM: === フェーズ終了 PROCESS_VALIDATIONS 3
[00FC:000B-0EB0] 2013/03/18 23:58:33 HTTP JVM: === フェーズ開始 UPDATE_MODEL_VALUES 4
[00FC:000B-0EB0] 2013/03/18 23:58:33 HTTP JVM: === フェーズ終了 UPDATE_MODEL_VALUES 4
[00FC:000B-0EB0] 2013/03/18 23:58:33 HTTP JVM: === フェーズ開始 INVOKE_APPLICATION 5
[00FC:000B-0EB0] 2013/03/18 23:58:33 HTTP JVM: === フェーズ終了 INVOKE_APPLICATION 5
[00FC:000B-0EB0] 2013/03/18 23:58:33 HTTP JVM: === フェーズ開始 RENDER_RESPONSE 6
[00FC:000B-0EB0] 2013/03/18 23:58:33 HTTP JVM: === フェーズ終了 RENDER_RESPONSE 6
[00FC:000B-0EB0] 2013/03/18 23:58:33 HTTP JVM: === XPage 処理完了
[00FC:000B-0EB0] 2013/03/18 23:58:33 HTTP JVM:
[00FC:000B-0EB0] 2013/03/18 23:58:33 HTTP JVM:
テスト環境
この記事の内容は Lotus Notes/Domino 8.5.3 FP1 で動作確認しました。